/*
 * ReflectHelper.java	2005-7-19
 *
 * 版权所有: 自由思考组织(FTO)软件团队 2000-2005, 保留所有权利.
 * 这个软件是自由思考组织(FTO)软件团队开发的，如果要使用这个软件，请首先阅读并接受许可协议。
 *
 * Copyright 2000-2005 FTO Software Team, Inc. All Rights Reserved.
 * This software is the proprietary information of FTO Software Team, Inc.
 * Use is subject to license terms.
 *
 * FTO站点：http://www.free-think.org
 */
package com.unism.util;

import java.lang.reflect.Constructor;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


/**
 * 此助手提供对类和实例操作的相关方法。创建类对象，创建实例等。
 *
 *
 * <p><pre><b>
 * 历史更新记录:</b>
 * 2005-07-19  创建此类型
 * </pre></p>
 *
 *
 * @author   <a href="mailto:13466510689@139.com">catch</a>
 * @version  1.0
 * @since    panda_framework 1.0
 *
 */
public abstract class ReflectHelper {

	private ReflectHelper(){}


	/**
	 * 根据类路径创建类对象
	 * @param name 类名称，包含类路径
	 * @return 类
	 */
	@SuppressWarnings("unchecked")
	public static Class forName(String name){
		try {
			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
			if(contextClassLoader!=null) {
				return contextClassLoader.loadClass(name);
			} else {
				return Class.forName(name);
			}
		}
		catch (Exception e) {
			try {
				return Class.forName(name);
			} catch (ClassNotFoundException cnfEx) {
				throw new RuntimeException(cnfEx);
			}
		}
	}

	@SuppressWarnings("unchecked")
	public static Class classForName(String name) throws ClassNotFoundException {
		try {
			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
			if (contextClassLoader!=null) {
				return contextClassLoader.loadClass(name);
			} 
			else {
				return Class.forName(name);
			}
		}
		catch (Exception e) {
			return Class.forName(name);
		}
	}

	@SuppressWarnings("unchecked")
	public static Class classForName(String name, Class caller) throws ClassNotFoundException {
		try {
			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
			if (contextClassLoader!=null) {
				return contextClassLoader.loadClass(name);
			}
			else {
				return Class.forName( name, true, caller.getClassLoader() );
			}
		}
		catch (Exception e) {
			return Class.forName( name, true, caller.getClassLoader() );
		}
	}
	
	/**
	 * 创建类的实例
	 * @param clazz 类
	 * @param types 构造方法参数类型
	 * @param initargs 构造方法参数实例
	 * @return 类的实例
	 */
	@SuppressWarnings("unchecked")
	public static Object newInstance(Class clazz, Class[] types, Object[] initargs){		
		try{
			Constructor cr = clazz.getConstructor(types);
			return cr.newInstance(initargs);
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}

	/**
	 * 创建类的实例
	 * @param clazz 类
	 * @return 类的实例
	 */
	@SuppressWarnings("unchecked")
	public static Object newInstance(Class clazz){
		try{
			return clazz.newInstance();
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}

	/**
	 * 方法调用
	 * @param obj          对象
	 * @param methodName   被调用的方法名
	 * @param types        方法参数类型
	 * @param args         方法参数值
	 * @return             结果
	 */
	@SuppressWarnings("unchecked")
	public static Object invoke(Object obj, String methodName, Class[] types, Object[] args){
		try{
			Method method = obj.getClass().getMethod(methodName, types);
			return method.invoke(obj, args);
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}

	/**
	 * 方法调用
	 * @param obj         对象
	 * @param methodName  被调用的方法名
	 * @return 结果
	 */
	public static Object invoke(Object obj, String methodName){
		try{
			Method method = obj.getClass().getMethod(methodName);
			return method.invoke(obj);
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}


	/**
	 * 判断是否Public方法或成员字段
	 * @param clazz 类
	 * @param member Member
	 */
	@SuppressWarnings("unchecked")
	public static boolean isPublic(Class clazz, Member member) {
		return Modifier.isPublic( member.getModifiers() ) && Modifier.isPublic( clazz.getModifiers() );
	}

	/**
	 * 判断是否抽象类
	 * @param clazz 类
	 */
	@SuppressWarnings("unchecked")
	public static boolean isAbstract(Class clazz) {
		int modifier = clazz.getModifiers();
		return Modifier.isAbstract(modifier);
	}
	
	/**
	 * 判断是否是Final类,如果是final类则此类不可被继承
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static boolean isFinal(Class clazz) {
		int modifier = clazz.getModifiers();
		return Modifier.isFinal(modifier);
	}
	
	

	/**
	 * 判断是否接口
	 * @param clazz 类
	 */
	@SuppressWarnings("unchecked")
	public static boolean isInterface(Class clazz) {
		int modifier = clazz.getModifiers();
		return Modifier.isInterface(modifier);
	}
}
